/* -*-jde-*- */
package app.alumnoe.cv.beans;

import app.conexion.Conexion;
import app.conexion.ConexionException;
import app.util.Fecha;
import app.util.SQLInjectionException;
import app.util.Validator;
import app.util.appException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Formación del alumno o egresado a partir la institución educativa
 *
 * @author Victor Miguel Peralta Santa Anna
 * @since Diciembre 2011
 * @version 0.1
 */
public class Formacion {

    /**
     * El identificador para la formación
     */
    private int nIdFormacion;
    /**
     * El identificador del curriculum vitae
     */
    private int nIdCV;
    /**
     * La cadena de título recibido
     */
    private String sTituloRecibido;
    /**
     * La cadena de institución educativa
     */
    private String sInstitucionEducativa;
    /**
     * La fecha de inicio de esta formación academica
     */
    private Fecha dFechaInicio;
    /**
     * La fecha de finalización si es que existe
     */
    private Fecha dFechaFin;
    /**
     * El promedio del curso/formación
     */
    private String sPromedio;
    /**
     * La descripción apropiada para la formación.
     */
    private String sDescripcion;

    public Formacion(int IdFormacion, int nIdCV, String sTituloRecibido, String sInstitucionEducativa, Fecha dFechaInicio, Fecha dFechaFin, String sPromedio, String sDescripcion) {
        this.nIdFormacion = IdFormacion;
        this.nIdCV = nIdCV;
        this.sTituloRecibido = sTituloRecibido;
        this.sInstitucionEducativa = sInstitucionEducativa;
        this.dFechaInicio = dFechaInicio;
        this.dFechaFin = dFechaFin;
        this.sPromedio = sPromedio;
        this.sDescripcion = sDescripcion;
    }

    @Override
    public String toString() {
        return "Formacion{" + "IdFormacion=" + getIdFormacion() + ", nIdCV=" + getnIdCV() + ", sTituloRecibido=" + getsTituloRecibido() + ", sInstitucionEducativa=" + getsInstitucionEducativa() + ", dFechaInicio=" + getdFechaInicio() + ", dFechaFin=" + getdFechaFin() + ", sPromedio=" + getsPromedio() + ", sDescripcion=" + getsDescripcion() + '}';
    }

    /**
     * @return the IdFormacion
     */
    public int getIdFormacion() {
        return nIdFormacion;
    }

    /**
     * @return the nIdCV
     */
    public int getnIdCV() {
        return nIdCV;
    }

    /**
     * @return the sTituloRecibido
     */
    public String getsTituloRecibido() {
        return sTituloRecibido;
    }

    /**
     * @param sTituloRecibido the sTituloRecibido to set
     */
    public void setsTituloRecibido(String sTituloRecibido) {
        this.sTituloRecibido = sTituloRecibido;
    }

    /**
     * @return the sInstitucionEducativa
     */
    public String getsInstitucionEducativa() {
        return sInstitucionEducativa;
    }

    /**
     * @param sInstitucionEducativa the sInstitucionEducativa to set
     */
    public void setsInstitucionEducativa(String sInstitucionEducativa) {
        this.sInstitucionEducativa = sInstitucionEducativa;
    }

    /**
     * @return the dFechaInicio
     */
    public Fecha getdFechaInicio() {
        return dFechaInicio;
    }

    /**
     * @param dFechaInicio the dFechaInicio to set
     */
    public void setdFechaInicio(Fecha dFechaInicio) {
        this.dFechaInicio = dFechaInicio;
    }

    /**
     * @return the dFechaFin
     */
    public Fecha getdFechaFin() {
        return dFechaFin;
    }

    /**
     * @param dFechaFin the dFechaFin to set
     */
    public void setdFechaFin(Fecha dFechaFin) {
        this.dFechaFin = dFechaFin;
    }

    /**
     * @return the sPromedio
     */
    public String getsPromedio() {
        return sPromedio;
    }

    /**
     * @param sPromedio the sPromedio to set
     */
    public void setsPromedio(String sPromedio) {
        this.sPromedio = sPromedio;
    }

    /**
     * @return the sDescripcion
     */
    public String getsDescripcion() {
        return sDescripcion;
    }

    /**
     * @param sDescripcion the sDescripcion to set
     */
    public void setsDescripcion(String sDescripcion) {
        this.sDescripcion = sDescripcion;
    }

    /**
     * Guarda el objeto en la base de datos independientemente si éste es nuevo
     * o no.
     */
    public void save() throws appException {

        try {

            Conexion con = new Conexion();
            String fechafin = getdFechaFin() == null ? null : "'" + getdFechaFin().toString() + "'";

            String query = "select ";
            if (nIdFormacion == -1) {
                query += "addCVFormacion(" + nIdCV;
                query += ", '" + sTituloRecibido + "'";
                query += ", '" + sInstitucionEducativa + "'";
                query += ", '" + dFechaInicio.toString() + "'";
                query += ", " + fechafin + "";
                query += ", '" + sPromedio + "'";
                query += ", '" + sDescripcion + "'";
                query += ");";

                if (!Validator.checkSQLInjection(query)) {
                    ResultSet r = con.exec(query);
                    while (r.next()) {
                        int resultado = r.getInt("addCVFormacion");
                        this.nIdFormacion = resultado;
                    }
                }

            } else {

                query += "updateFormacion(" + nIdFormacion;
                query += ", '" + sTituloRecibido + "'";
                query += ", '" + sInstitucionEducativa + "'";
                query += ", '" + dFechaInicio.toString() + "'";
                query += ", " + fechafin + "";
                query += ", '" + sPromedio + "'";
                query += ", '" + sDescripcion + "'";
                query += ");";

                if (!Validator.checkSQLInjection(query)) {
                    con.exec(query);
                }
            }

            con.close();
        } catch (SQLException ex) {
            System.err.println(ex);
            Logger.getLogger(Formacion.class.getName()).log(Level.SEVERE, null, ex);
            throw new appException("No se pudo guardar el elemento: Formacion");
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo guardar el elemento: Formacion");
        } catch (SQLInjectionException sqlie) {
            System.err.println(sqlie);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, sqlie);
            throw new appException(sqlie.getMessage());
        }

    }

    /**
     * Borra el objeto de la base de datos.
     */
    public void delete() throws appException {
        try {
            Conexion con = new Conexion();
            String query = "select deleteFormacion( " + nIdFormacion + " );";
            con.exec(query);
            con.close();
        } catch (ConexionException ce) {
            System.err.println(ce);
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ce);
            throw new appException("No se pudo borrar el elemento: Formacion");
        }
    }

    /**
     * Conexiones de prueba a la base de datos
     *
     * @param args
     * @throws ConexionException
     * @throws SQLException
     * @throws appException
     */
    public static void main(String args[]) throws ConexionException, SQLException, appException {


        //nuevo
        Formacion f = new Formacion(-1, 1, "titulo recibido", "institucion", new Fecha(2011, 03, 18), new Fecha(2012, 02, 18), "promedio", "descripcion");
        f.save();

        //f.delete();

        System.out.println(f);
    }
}